{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**问题：**\n",
    "假设你正在为一个电影推荐系统设计一个简单的KNN算法。我们有以下一些用户的电影评分数据，数据由两个特征组成：用户对电影A和电影B的评分，分别在1-5之间。用户的标签（电影类型偏好）是动作片（标签0）或者是喜剧片（标签1）。我们有一个新用户，他给电影A评分为3，电影B评分为4。请问这个用户可能偏好哪种类型的电影？\n",
    "\n",
    "**数据：**\n",
    "\n",
    "| 用户   | 电影A评分 | 电影B评分 | 偏好类型 |\n",
    "| ------ | --------- | --------- | -------- |\n",
    "| 用户1  | 5         | 1         | 动作片   |\n",
    "| 用户2  | 4         | 2         | 动作片   |\n",
    "| 用户3  | 2         | 5         | 喜剧片   |\n",
    "| 用户4  | 1         | 4         | 喜剧片   |\n",
    "| 用户5  | 3         | 2         | 动作片   |\n",
    "| 用户6  | 2         | 5         | 喜剧片   |\n",
    "\n",
    "你需要做以下步骤：\n",
    "1. 构造数据\n",
    "2. 创建KNN模型\n",
    "3. 使用数据训练模型\n",
    "4. 预测新用户的喜好"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 0. 引入核心包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. X, y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "data = {\n",
    "    '电影A评分': [5, 4, 2, 1, 3, 2],\n",
    "    '电影B评分': [1, 2, 5, 4, 2, 5],\n",
    "    '偏好类型': [0, 0, 1, 1, 0, 1]  # 0: 动作片, 1: 喜剧片\n",
    "}\n",
    "df = pd.DataFrame(data)\n",
    "X = df[['电影A评分', '电影B评分']].values#TODO\n",
    "\n",
    "y =  df['偏好类型'].values#TODO  # 0表示动作片，1表示喜剧片"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 创建 KNN 模型\n",
    "k = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "knn = KNeighborsClassifier(n_neighbors=1)#TODO"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {color: black;}#sk-container-id-1 pre{padding: 0;}#sk-container-id-1 div.sk-toggleable {background-color: white;}#sk-container-id-1 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-1 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-1 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-1 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-1 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-1 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-1 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-1 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-1 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-1 div.sk-item {position: relative;z-index: 1;}#sk-container-id-1 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-1 div.sk-item::before, #sk-container-id-1 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-1 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-1 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-1 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-1 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-1 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-1 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-1 div.sk-label-container {text-align: center;}#sk-container-id-1 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-1 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KNeighborsClassifier(n_neighbors=1)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">KNeighborsClassifier</label><div class=\"sk-toggleable__content\"><pre>KNeighborsClassifier(n_neighbors=1)</pre></div></div></div></div></div>"
      ],
      "text/plain": [
       "KNeighborsClassifier(n_neighbors=1)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn.fit(X, y)# TODO"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. 用模型推理(预测)用户的喜好"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "new_user = np.array([[3, 4]])\n",
    "prediction = knn.predict(new_user)#TODO"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5. 数据可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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iMgYdH7y9f79+w0RBxEREZHR6VwYAcDVq1exY8cOpKWloaCgQGPdxx9/rJfAiIiIiGqazoXRvn37MHDgQDRu3Bjnz5/Hk08+idTUVAgh0L59e0PESERERFQjdL5df86cOZg1axb++OMP2NjYID4+HleuXEH37t3x/PPPGyJGIiIiohqhc2F07tw59ZOwpVIpHjx4AHt7e7zzzjt4//339R4gERERUU3RuTCqU6cO5HI5AMDDwwMXL15Ur7tx44b+IiMiIiKqYTrPMerUqRMOHz6MVq1aoV+/fpg1axbOnDmDrVu3olOnToaIkYiIiKhG6FwYffzxx7h37x4AYMGCBbh37x62bNmCZs2aqR8CSURERGSKdCqMioqKcOXKFfj7+wMA7Ozs8MUXXxgkMCIiIqKaptMcI0tLS/Tp0wd37twxUDhERERExqPz5Os2bdrg33//NUQsREREREalc2G0ePFiREZGYufOncjMzERubq7GDxEREZGp0nny9XPPPQcAGDhwICQSibpdCAGJRIKioiL9RUdERERUg/gSWSIiIiIVnQuj7t27GyIOIiIiIqPTeY4RERERkbliYURERESkwsKIiIiISMWohdHKlSvh7+8PR0dHODo6IigoCD/++GOF2yQlJaFDhw6wsbFBkyZNEB0dXUPREhERkbmrdmFUUFCgfnearjw9PbF06VIkJycjOTkZzz77LMLCwvDnn39q7X/p0iWEhoaia9euSElJwdy5czFt2jTEx8dXJwUiIiIiADoWRmvXrsVrr72GjRs3AgDmzJkDBwcH1K1bF8HBwbh586ZOBx8wYABCQ0Ph6+sLX19fLF68GPb29jh27JjW/tHR0WjUqBGioqLQsmVLTJgwAePGjcOyZct0Oi4RERGRNlW+XX/x4sVYvHgxnnnmGcTFxeHQoUPYvn073nnnHVhYWGDFihWYN28eVq5c+UiBFBUV4dtvv8X9+/cRFBSktc/Ro0cREhKi0danTx/ExMRAoVDAysqqzDZyuRxyuVy9XPJ0boVCAYVC8Uixlqdkf/reb21h7vkB5p8j8zN95p4j8zN9hsqxpj4ziRBCVKVj8+bN8c4772DkyJFITk7G008/jS1btmDYsGEAgB9//BGTJ0/G5cuXdQrgzJkzCAoKQn5+Puzt7REXF4fQ0FCtfX19fTFmzBjMnTtX3XbkyBF07twZ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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.title(\"User Movie Preference\", size=15) \n",
    "plt.xlabel(\"Movie A rating\")\n",
    "plt.ylabel(\"Movie B rating\")\n",
    "plt.grid()\n",
    "\n",
    "# 绘制原始样本点，要求不同的影片喜好类别用不同的颜色标记\n",
    "# 提示: 用scatter散点图绘制，用它的参数c实现不同的类别用不同的颜色标记\n",
    "scatter = plt.scatter(X[:, 0], X[:, 1], c=y, cmap='bwr', marker='o', label='用户评分')#TODO\n",
    "\n",
    "# 绘制新数据点，用红色x标记，大小为8\n",
    "# 提示：用plt.plot()绘制，用它的参数marker实现不同的标记符号\n",
    "plt.plot(new_user[0, 0], new_user[0, 1], marker='x', color='red', markersize=8, label='新用户评分')#TODO\n",
    "\n",
    "\n",
    "# 新数据最近邻索引为第一个最近邻的索引\n",
    "dist, idx = knn.kneighbors(new_user) #TODO\n",
    "nearest = X[idx[0][0]]#TODO # 获取最近邻点的坐标，这是一个列表，第一个元素是x坐标，第二个元素是y坐标\n",
    "\n",
    "# 用红线标记新数据点与最近邻点的连接线\n",
    "# 提示：用plt.plot()绘制，用 r-- 实现红色虚线\n",
    "plt.plot([new_user[0, 0], nearest[0]], [new_user[0, 1], nearest[1]], 'r--')#TODO\n",
    "\n",
    "# 为每个点添加坐标文本  \n",
    "for x, y in zip(X[:, 0], X[:, 1]):\n",
    "    plt.text(x, y+0.1, f'({x}, {y})') \n",
    "\n",
    "# 为新数据点添加坐标文本\n",
    "plt.text(new_user[0,0], new_user[0,1]+0.1, f'({new_user[0,0]}, {new_user[0,1]})')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
